<!DOCTYPE html>
<html lang="en-us">
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
<meta charset="UTF-8">
<title>Discovery | Elasticsearch Guide [7.7] | Elastic</title>
<link rel="home" href="index.html" title="Elasticsearch Guide [7.7]">
<link rel="up" href="modules-discovery.html" title="Discovery and cluster formation">
<link rel="prev" href="modules-discovery.html" title="Discovery and cluster formation">
<link rel="next" href="modules-discovery-quorums.html" title="Quorum-based decision making">
<meta name="DC.type" content="Learn/Docs/Elasticsearch/Reference/7.7">
<meta name="DC.subject" content="Elasticsearch">
<meta name="DC.identifier" content="7.7">
<meta name="robots" content="noindex,nofollow">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.optimizely.com/js/18132920325.js"></script>
    <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
    <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
    <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
    <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
    <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
    <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
    <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
    <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
    <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
    <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
    <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
    <link rel="manifest" href="/manifest.json">
    <meta name="apple-mobile-web-app-title" content="Elastic">
    <meta name="application-name" content="Elastic">
    <meta name="msapplication-TileColor" content="#ffffff">
    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
    <meta name="theme-color" content="#ffffff">
    <meta name="naver-site-verification" content="936882c1853b701b3cef3721758d80535413dbfd">
    <meta name="yandex-verification" content="d8a47e95d0972434">
    <meta name="localized" content="true">
    <meta name="st:robots" content="follow,index">
    <meta property="og:image" content="https://www.elastic.co/static/images/elastic-logo-200.png">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <link rel="icon" href="/favicon.ico" type="image/x-icon">
    <link rel="apple-touch-icon-precomposed" sizes="64x64" href="/favicon_64x64_16bit.png">
    <link rel="apple-touch-icon-precomposed" sizes="32x32" href="/favicon_32x32.png">
    <link rel="apple-touch-icon-precomposed" sizes="16x16" href="/favicon_16x16.png">
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href="/guide/static/styles.css">
  </head>

  <!--© 2015-2021 Elasticsearch B.V. Copying, publishing and/or distributing without written permission is strictly prohibited.-->

  <body>
    <!-- Google Tag Manager -->
    <script>dataLayer = [];</script><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-58RLH5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-58RLH5');</script>
    <!-- End Google Tag Manager -->

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-12395217-16"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'UA-12395217-16');
    </script>

    <!--BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET-->
    <script type="text/javascript">
      (function(){var g=function(e,h,f,g){
      this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
      this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
      this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
      this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
      this.start=function(){var a=this;window.addEventListener?window.addEventListener("load",function(){a.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){a.go()})}};
      try{(new g(100,"r","QSI_S_ZN_emkP0oSe9Qrn7kF","https://znemkp0ose9qrn7kf-elastic.siteintercept.qualtrics.com/WRSiteInterceptEngine/?Q_ZID=ZN_emkP0oSe9Qrn7kF")).start()}catch(i){}})();
    </script><div id="ZN_emkP0oSe9Qrn7kF"><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
    <!--END WEBSITE FEEDBACK SNIPPET-->

    <div id="elastic-nav" style="display:none;"></div>
    <script src="https://www.elastic.co/elastic-nav.js"></script>

    <!-- Subnav -->
    <div>
      <div>
        <div class="tertiary-nav d-none d-md-block">
          <div class="container">
            <div class="p-t-b-15 d-flex justify-content-between nav-container">
              <div class="breadcrum-wrapper"><span><a href="/guide/" style="font-size: 14px; font-weight: 600; color: #000;">Docs</a></span></div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <div class="main-container">
      <section id="content">
        <div class="content-wrapper">

          <section id="guide" lang="en">
            <div class="container">
              <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                  <!-- start body -->
                  <div class="page_header">
<strong>IMPORTANT</strong>: No additional bug fixes or documentation updates
will be released for this version. For the latest information, see the
<a href="../current/index.html">current release documentation</a>.
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch Guide [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="setup.html">Set up Elasticsearch</a></span>
»
<span class="breadcrumb-link"><a href="modules-discovery.html">Discovery and cluster formation</a></span>
»
<span class="breadcrumb-node">Discovery</span>
</div>
<div class="navheader">
<span class="prev">
<a href="modules-discovery.html">« Discovery and cluster formation</a>
</span>
<span class="next">
<a href="modules-discovery-quorums.html">Quorum-based decision making »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="modules-discovery-hosts-providers"></a>Discovery<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/modules/discovery/discovery.asciidoc">edit</a>
</h2>
</div></div></div>
<p>Discovery is the process by which the cluster formation module finds other
nodes with which to form a cluster. This process runs when you start an
Elasticsearch node or when a node believes the master node failed and continues
until the master node is found or a new master node is elected.</p>
<p>This process starts with a list of <em>seed</em> addresses from one or more
<a class="xref" href="modules-discovery-hosts-providers.html#built-in-hosts-providers" title="Seed hosts providers">seed hosts providers</a>, together with the addresses
of any master-eligible nodes that were in the last-known cluster. The process
operates in two phases: First, each node probes the seed addresses by
connecting to each address and attempting to identify the node to which it is
connected and to verify that it is master-eligible. Secondly, if successful, it
shares with the remote node a list of all of its known master-eligible peers
and the remote node responds with <em>its</em> peers in turn. The node then probes all
the new nodes that it just discovered, requests their peers, and so on.</p>
<p>If the node is not master-eligible then it continues this discovery process
until it has discovered an elected master node. If no elected master is
discovered then the node will retry after <code class="literal">discovery.find_peers_interval</code> which
defaults to <code class="literal">1s</code>.</p>
<p>If the node is master-eligible then it continues this discovery process until
it has either discovered an elected master node or else it has discovered
enough masterless master-eligible nodes to complete an election. If neither of
these occur quickly enough then the node will retry after
<code class="literal">discovery.find_peers_interval</code> which defaults to <code class="literal">1s</code>.</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="built-in-hosts-providers"></a>Seed hosts providers<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/modules/discovery/discovery.asciidoc">edit</a>
</h3>
</div></div></div>
<p>By default the cluster formation module offers two seed hosts providers to
configure the list of seed nodes: a <em>settings</em>-based and a <em>file</em>-based seed
hosts provider.  It can be extended to support cloud environments and other
forms of seed hosts providers via <a href="/guide/en/elasticsearch/plugins/7.7/discovery.html" class="ulink" target="_top">discovery plugins</a>.
Seed hosts providers are configured using the <code class="literal">discovery.seed_providers</code>
setting, which defaults to the <em>settings</em>-based hosts provider. This setting
accepts a list of different providers, allowing you to make use of multiple
ways to find the seed hosts for your cluster.</p>
<p>Each seed hosts provider yields the IP addresses or hostnames of the seed
nodes. If it returns any hostnames then these are resolved to IP addresses
using a DNS lookup. If a hostname resolves to multiple IP addresses then Elasticsearch
tries to find a seed node at all of these addresses. If the hosts provider does
not explicitly give the TCP port of the node by then, it will implicitly use the
first port in the port range given by <code class="literal">transport.profiles.default.port</code>, or by
<code class="literal">transport.port</code> if <code class="literal">transport.profiles.default.port</code> is not set. The number of
concurrent lookups is controlled by
<code class="literal">discovery.seed_resolver.max_concurrent_resolvers</code> which defaults to <code class="literal">10</code>, and
the timeout for each lookup is controlled by <code class="literal">discovery.seed_resolver.timeout</code>
which defaults to <code class="literal">5s</code>. Note that DNS lookups are subject to
<a class="xref" href="networkaddress-cache-ttl.html" title="DNS cache settings">JVM DNS caching</a>.</p>
<h5>
<a id="settings-based-hosts-provider"></a>Settings-based seed hosts provider<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/modules/discovery/discovery.asciidoc">edit</a>
</h5>
<p>The settings-based seed hosts provider uses a node setting to configure a
static list of the addresses of the seed nodes. These addresses can be given as
hostnames or IP addresses; hosts specified as hostnames are resolved to IP
addresses during each round of discovery.</p>
<p>The list of hosts is set using the <a class="xref" href="discovery-settings.html#unicast.hosts" title="discovery.seed_hosts"><code class="literal">discovery.seed_hosts</code></a>
static setting. For example:</p>
<div class="pre_wrapper lang-yaml">
<pre class="programlisting prettyprint lang-yaml">discovery.seed_hosts:
   - 192.168.1.10:9300
   - 192.168.1.11 <a id="CO29-1"></a><i class="conum" data-value="1"></i>
   - seeds.mydomain.com <a id="CO29-2"></a><i class="conum" data-value="2"></i></pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO29-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>The port will default to <code class="literal">transport.profiles.default.port</code> and fallback to
<code class="literal">transport.port</code> if not specified.</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO29-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>If a hostname resolves to multiple IP addresses, Elasticsearch will attempt to
connect to every resolved address.</p>
</td>
</tr>
</table>
</div>
<h5>
<a id="file-based-hosts-provider"></a>File-based seed hosts provider<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/modules/discovery/discovery.asciidoc">edit</a>
</h5>
<p>The file-based seed hosts provider configures a list of hosts via an external
file.  Elasticsearch reloads this file when it changes, so that the list of seed nodes
can change dynamically without needing to restart each node. For example, this
gives a convenient mechanism for an Elasticsearch instance that is run in a Docker
container to be dynamically supplied with a list of IP addresses to connect to
when those IP addresses may not be known at node startup.</p>
<p>To enable file-based discovery, configure the <code class="literal">file</code> hosts provider as follows
in the <code class="literal">elasticsearch.yml</code> file:</p>
<div class="pre_wrapper lang-yml">
<pre class="programlisting prettyprint lang-yml">discovery.seed_providers: file</pre>
</div>
<p>Then create a file at <code class="literal">$ES_PATH_CONF/unicast_hosts.txt</code> in the format described
below. Any time a change is made to the <code class="literal">unicast_hosts.txt</code> file the new
changes will be picked up by Elasticsearch and the new hosts list will be used.</p>
<p>Note that the file-based discovery plugin augments the unicast hosts list in
<code class="literal">elasticsearch.yml</code>: if there are valid seed addresses in
<code class="literal">discovery.seed_hosts</code> then Elasticsearch uses those addresses in addition to those
supplied in <code class="literal">unicast_hosts.txt</code>.</p>
<p>The <code class="literal">unicast_hosts.txt</code> file contains one node entry per line. Each node entry
consists of the host (host name or IP address) and an optional transport port
number. If the port number is specified, is must come immediately after the
host (on the same line) separated by a <code class="literal">:</code>.  If the port number is not
specified, Elasticsearch will implicitly use the first port in the port range given by
<code class="literal">transport.profiles.default.port</code>, or by <code class="literal">transport.port</code> if
<code class="literal">transport.profiles.default.port</code> is not set.</p>
<p>For example, this is an example of <code class="literal">unicast_hosts.txt</code> for a cluster with four
nodes that participate in discovery, some of which are not running on the
default port:</p>
<div class="pre_wrapper lang-txt">
<pre class="programlisting prettyprint lang-txt">10.10.10.5
10.10.10.6:9305
10.10.10.5:10005
# an IPv6 address
[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:9301</pre>
</div>
<p>Host names are allowed instead of IP addresses and are resolved by DNS as
described above. IPv6 addresses must be given in brackets with the port, if
needed, coming after the brackets.</p>
<p>You can also add comments to this file. All comments must appear on their lines
starting with <code class="literal">#</code> (i.e. comments cannot start in the middle of a line).</p>
<h5>
<a id="ec2-hosts-provider"></a>EC2 hosts provider<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/modules/discovery/discovery.asciidoc">edit</a>
</h5>
<p>The <a href="/guide/en/elasticsearch/plugins/7.7/discovery-ec2.html" class="ulink" target="_top">EC2 discovery plugin</a> adds a hosts provider
that uses the <a href="https://github.com/aws/aws-sdk-java" class="ulink" target="_top">AWS API</a> to find a list of
seed nodes.</p>
<h5>
<a id="azure-classic-hosts-provider"></a>Azure Classic hosts provider<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/modules/discovery/discovery.asciidoc">edit</a>
</h5>
<p>The <a href="/guide/en/elasticsearch/plugins/7.7/discovery-azure-classic.html" class="ulink" target="_top">Azure Classic discovery plugin</a> adds
a hosts provider that uses the Azure Classic API find a list of seed nodes.</p>
<h5>
<a id="gce-hosts-provider"></a>Google Compute Engine hosts provider<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/modules/discovery/discovery.asciidoc">edit</a>
</h5>
<p>The <a href="/guide/en/elasticsearch/plugins/7.7/discovery-gce.html" class="ulink" target="_top">GCE discovery plugin</a> adds a hosts provider
that uses the GCE API find a list of seed nodes.</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="modules-discovery.html">« Discovery and cluster formation</a>
</span>
<span class="next">
<a href="modules-discovery-quorums.html">Quorum-based decision making »</a>
</span>
</div>
</div>

                  <!-- end body -->
                </div>
                <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                  <div id="rtpcontainer" style="display: block;">
                    <div class="mktg-promo">
                      <h3>Most Popular</h3>
                      <ul class="icons">
                        <li class="icon-elasticsearch-white"><a href="https://www.elastic.co/webinars/getting-started-elasticsearch?baymax=default&amp;elektra=docs&amp;storm=top-video">Get Started with Elasticsearch: Video</a></li>
                        <li class="icon-kibana-white"><a href="https://www.elastic.co/webinars/getting-started-kibana?baymax=default&amp;elektra=docs&amp;storm=top-video">Intro to Kibana: Video</a></li>
                        <li class="icon-logstash-white"><a href="https://www.elastic.co/webinars/introduction-elk-stack?baymax=default&amp;elektra=docs&amp;storm=top-video">ELK for Logs &amp; Metrics: Video</a></li>
                      </ul>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </section>

        </div>


<div id="elastic-footer"></div>
<script src="https://www.elastic.co/elastic-footer.js"></script>
<!-- Footer Section end-->

      </section>
    </div>

<script src="/guide/static/jquery.js"></script>
<script type="text/javascript" src="/guide/static/docs.js"></script>
<script type="text/javascript">
  window.initial_state = {}</script>
  </body>
</html>
